Skip to content

fix(github): give each mock client its own HTTP transport - #413

Merged
jongio merged 1 commit into
mainfrom
fix/401-github-test-transport
Aug 27, 2026
Merged

jongio merged 1 commit into
mainfrom
fix/401-github-test-transport

Conversation

@jongio

@jongio jongio commented Aug 27, 2026

Copy link
Copy Markdown
Owner

Closes #401

Problem

urlRewriteTransport.RoundTrip delegated to the process-global http.DefaultTransport, so every mock client built by setupMockClient shared one connection pool. That coupled all 13 t.Parallel() tests in the package to each other's httptest server teardown.

The symptom was intermittent race-detector CI failures that looked like real regressions on unrelated PRs, such as this one on #395, which touched only cmd/clean.go, cmd/clean_test.go, and a docs page:

--- FAIL: TestClient_DeleteBranch_Success/long_branch_name
    net/http: HTTP/1.x transport connection broken: http: CloseIdleConnections called

Fix

Give each mock client its own transport, and drain it on cleanup.

http.DefaultTransport.Clone() rather than a fresh &http.Transport{} so the transport keeps the same settings it had before (timeouts, HTTP/2 attempt, proxy resolution) and only the connection pool stops being shared. This keeps the change behavior-preserving apart from the isolation itself.

Cleanup ordering matters and is deliberate: t.Cleanup runs LIFO, so registering transport.CloseIdleConnections after server.Close means the transport drains first, before the server it points at goes away.

Scope

One file, 16 insertions. setupMockClient is the single chokepoint for all 125 call sites across 6 test files, so none of them needed changes.

Verification

  • go test ./internal/github/ -race -count=20 passes
  • go build ./... clean
  • go vet ./internal/github/ clean
  • gofmt clean

Acceptance criteria

  • urlRewriteTransport uses a per-instance transport, not the global default
  • setupMockClient closes idle connections for its own transport on cleanup
  • go test ./internal/github/ -race -count=20 passes consistently

urlRewriteTransport delegated to the process-global http.DefaultTransport, so
every mock client in the package shared one connection pool. That coupled all
t.Parallel() tests to each other's httptest server teardown and produced
intermittent "connection broken" failures that looked like regressions on
unrelated PRs.

Clone DefaultTransport per client so its settings are preserved while the pool
is not shared, and drain idle connections on cleanup before the server closes.

Verified with go test ./internal/github/ -race -count=20.

Closes #401

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 98ae0c9c-bdbe-418e-8488-15082edca7dc
@github-actions

Copy link
Copy Markdown
Contributor

Benchmarks: darwin-arm64

📊 Results vs main (same-runner) , click to expand
goos: darwin
goarch: arm64
pkg: github.com/jongio/grut/internal/ai
cpu: Apple M1 (Virtual)
                                       │ bench-baseline.txt │          bench-current.txt           │
                                       │       sec/op       │    sec/op      vs base               │
RedactContent/small_500B-3                     104.2µ ±  9%    120.5µ ± 17%  +15.68% (p=0.002 n=6)
RedactContent/medium_5KB-3                     1.197m ± 19%    1.599m ± 14%  +33.60% (p=0.004 n=6)
RedactContent/large_50KB-3                     13.66m ± 16%    15.95m ± 13%  +16.71% (p=0.026 n=6)
RedactContent_NoMatch/small_500B-3             144.6µ ±  6%    171.4µ ± 11%  +18.54% (p=0.002 n=6)
RedactContent_NoMatch/medium_5KB-3             1.506m ± 10%    2.038m ± 17%  +35.32% (p=0.002 n=6)
RedactContent_NoMatch/large_50KB-3             15.41m ± 10%    20.35m ±  7%  +32.09% (p=0.002 n=6)
ShouldExcludeFile/match_builtin-3              61.99n ± 11%    68.87n ± 23%  +11.11% (p=0.041 n=6)
ShouldExcludeFile/match_user_pattern-3         2.353µ ± 11%    3.009µ ±  5%  +27.86% (p=0.002 n=6)
ShouldExcludeFile/no_match-3                   1.614µ ± 13%    2.193µ ±  8%  +35.92% (p=0.002 n=6)
NewRedactor-3                                  780.4n ± 21%   1061.0n ± 13%  +35.96% (p=0.002 n=6)
geomean                                        63.40µ          79.85µ        +25.93%

                                       │ bench-baseline.txt │           bench-current.txt            │
                                       │        B/op        │      B/op       vs base                │
RedactContent/small_500B-3                  2.876Ki ±  0%     2.879Ki ±   0%       ~ (p=0.232 n=6)
RedactContent/medium_5KB-3                  36.25Ki ±  0%     36.29Ki ±   0%       ~ (p=0.258 n=6)
RedactContent/large_50KB-3                  370.1Ki ±  0%     370.3Ki ±   0%  +0.04% (p=0.002 n=6)
RedactContent_NoMatch/small_500B-3            4.000 ±   ?       2.000 ±    ?       ~ (p=1.000 n=6)
RedactContent_NoMatch/medium_5KB-3            27.00 ±   ?       31.50 ± 363%       ~ (p=0.240 n=6)
RedactContent_NoMatch/large_50KB-3            82.50 ± 94%       52.00 ± 154%       ~ (p=0.738 n=6)
ShouldExcludeFile/match_builtin-3             0.000 ±  0%       0.000 ±   0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/match_user_pattern-3        0.000 ±  0%       0.000 ±   0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/no_match-3                  0.000 ±  0%       0.000 ±   0%       ~ (p=1.000 n=6) ¹
NewRedactor-3                               1.320Ki ±  0%     1.320Ki ±   0%       ~ (p=1.000 n=6) ¹
geomean                                                   ²                   -9.50%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                       │ bench-baseline.txt │         bench-current.txt          │
                                       │     allocs/op      │ allocs/op   vs base                │
RedactContent/small_500B-3                     12.00 ± 0%     12.00 ± 0%       ~ (p=1.000 n=6) ¹
RedactContent/medium_5KB-3                     60.00 ± 0%     60.00 ± 0%       ~ (p=1.000 n=6) ¹
RedactContent/large_50KB-3                     483.0 ± 0%     483.5 ± 0%       ~ (p=0.182 n=6)
RedactContent_NoMatch/small_500B-3             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
RedactContent_NoMatch/medium_5KB-3             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
RedactContent_NoMatch/large_50KB-3             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/match_builtin-3              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/match_user_pattern-3         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/no_match-3                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
NewRedactor-3                                  5.000 ± 0%     5.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                   ²               +0.01%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/jongio/grut/internal/config
                                   │ bench-baseline.txt │           bench-current.txt           │
                                   │       sec/op       │    sec/op      vs base                │
Validate/valid_defaults-3                  1.969µ ± 10%    3.608µ ± 28%   +83.21% (p=0.002 n=6)
Validate/with_arrays-3                     6.871µ ± 14%   11.721µ ±  9%   +70.59% (p=0.002 n=6)
Validate/invalid_multi_error-3             4.403µ ± 13%    4.562µ ±  9%         ~ (p=0.394 n=6)
ParseDefaultsTOML-3                        23.00µ ±  6%    27.96µ ±  8%   +21.55% (p=0.002 n=6)
RejectEmbeddedKeys/clean_config-3          1.179µ ±  3%    1.448µ ± 12%   +22.83% (p=0.002 n=6)
RejectEmbeddedKeys/with_patterns-3         7.071µ ±  4%    9.082µ ± 22%   +28.45% (p=0.002 n=6)
AppendEnumErr/match_first-3                25.71n ± 12%    40.93n ± 16%   +59.17% (p=0.002 n=6)
AppendEnumErr/match_last-3                 23.80n ± 15%    51.19n ± 17%  +115.11% (p=0.002 n=6)
AppendEnumErr/no_match-3                   607.2n ± 12%    899.3n ± 15%   +48.09% (p=0.002 n=6)
geomean                                    1.174µ          1.723µ         +46.71%

                                   │ bench-baseline.txt │          bench-current.txt           │
                                   │        B/op        │     B/op      vs base                │
Validate/valid_defaults-3                  867.0 ± 0%       867.0 ± 0%       ~ (p=1.000 n=6)
Validate/with_arrays-3                     866.5 ± 0%       867.0 ± 0%       ~ (p=0.675 n=6)
Validate/invalid_multi_error-3           2.035Ki ± 0%     2.035Ki ± 0%       ~ (p=0.758 n=6)
ParseDefaultsTOML-3                      1.836Ki ± 0%     1.836Ki ± 0%       ~ (p=1.000 n=6)
RejectEmbeddedKeys/clean_config-3          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
RejectEmbeddedKeys/with_patterns-3         0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/match_first-3                48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/match_last-3                 48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/no_match-3                   346.0 ± 0%       345.0 ± 0%       ~ (p=0.242 n=6)
geomean                                               ²                 -0.03%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                   │ bench-baseline.txt │         bench-current.txt          │
                                   │     allocs/op      │ allocs/op   vs base                │
Validate/valid_defaults-3                  18.00 ± 0%     18.00 ± 0%       ~ (p=1.000 n=6) ¹
Validate/with_arrays-3                     18.00 ± 0%     18.00 ± 0%       ~ (p=1.000 n=6) ¹
Validate/invalid_multi_error-3             58.00 ± 0%     58.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseDefaultsTOML-3                        52.00 ± 0%     52.00 ± 0%       ~ (p=1.000 n=6) ¹
RejectEmbeddedKeys/clean_config-3          0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
RejectEmbeddedKeys/with_patterns-3         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/match_first-3                1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/match_last-3                 1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/no_match-3                   12.00 ± 0%     12.00 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                               ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/jongio/grut/internal/crashlog
                                 │ bench-baseline.txt │          bench-current.txt           │
                                 │       sec/op       │    sec/op      vs base               │
ScrubPII/small_100B-3                    10.56µ ± 20%    13.20µ ± 10%  +25.01% (p=0.002 n=6)
ScrubPII/medium_1KB-3                    180.5µ ± 22%    250.3µ ± 15%  +38.63% (p=0.004 n=6)
ScrubPII/large_10KB-3                    2.488m ±  5%    3.029m ± 13%  +21.74% (p=0.002 n=6)
ScrubPII_NoSecrets/100B-3                19.33µ ± 18%    25.39µ ±  2%  +31.35% (p=0.002 n=6)
ScrubPII_NoSecrets/1KB-3                 186.4µ ±  2%    258.8µ ±  6%  +38.88% (p=0.002 n=6)
ScrubPII_NoSecrets/10KB-3                2.277m ±  4%    3.258m ± 15%  +43.08% (p=0.002 n=6)
ScrubLogTail/10_entries-3                104.1µ ± 11%    158.3µ ±  4%  +52.01% (p=0.002 n=6)
ScrubLogTail/50_entries-3                514.7µ ±  1%    828.4µ ± 17%  +60.94% (p=0.002 n=6)
ScrubLogTail/100_entries_mixed-3         8.846m ± 17%   13.073m ± 17%  +47.79% (p=0.002 n=6)
geomean                                  297.8µ          415.3µ        +39.42%

                                 │ bench-baseline.txt │         bench-current.txt          │
                                 │        B/op        │     B/op      vs base              │
ScrubPII/small_100B-3                      913.0 ± 0%     914.0 ± 0%       ~ (p=0.054 n=6)
ScrubPII/medium_1KB-3                    11.88Ki ± 0%   11.90Ki ± 0%  +0.12% (p=0.011 n=6)
ScrubPII/large_10KB-3                    227.9Ki ± 0%   227.9Ki ± 0%       ~ (p=0.900 n=6)
ScrubPII_NoSecrets/100B-3                1.173Ki ± 0%   1.174Ki ± 0%       ~ (p=0.102 n=6)
ScrubPII_NoSecrets/1KB-3                 10.08Ki ± 0%   10.09Ki ± 0%       ~ (p=0.119 n=6)
ScrubPII_NoSecrets/10KB-3                100.6Ki ± 0%   100.7Ki ± 0%       ~ (p=0.818 n=6)
ScrubLogTail/10_entries-3                9.081Ki ± 0%   9.079Ki ± 0%       ~ (p=0.504 n=6)
ScrubLogTail/50_entries-3                45.48Ki ± 0%   45.49Ki ± 0%       ~ (p=0.561 n=6)
ScrubLogTail/100_entries_mixed-3         545.5Ki ± 0%   545.5Ki ± 0%       ~ (p=0.699 n=6)
geomean                                  20.53Ki        20.54Ki       +0.06%

                                 │ bench-baseline.txt │          bench-current.txt          │
                                 │     allocs/op      │  allocs/op   vs base                │
ScrubPII/small_100B-3                      17.00 ± 0%    17.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubPII/medium_1KB-3                      27.00 ± 0%    27.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubPII/large_10KB-3                      79.00 ± 0%    79.00 ± 1%       ~ (p=0.455 n=6)
ScrubPII_NoSecrets/100B-3                  15.00 ± 0%    15.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubPII_NoSecrets/1KB-3                   15.00 ± 0%    15.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubPII_NoSecrets/10KB-3                  15.00 ± 0%    15.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubLogTail/10_entries-3                  171.0 ± 0%    171.0 ± 0%       ~ (p=1.000 n=6) ¹
ScrubLogTail/50_entries-3                  851.0 ± 0%    851.0 ± 0%       ~ (p=1.000 n=6) ¹
ScrubLogTail/100_entries_mixed-3          1.909k ± 0%   1.909k ± 0%       ~ (p=1.000 n=6) ¹
geomean                                    68.68         68.68       +0.00%
¹ all samples are equal

pkg: github.com/jongio/grut/internal/git
                               │ bench-baseline.txt │          bench-current.txt           │
                               │       sec/op       │    sec/op      vs base               │
ParseStatus/10_files-3                 2.033µ ±  7%    2.386µ ± 22%  +17.34% (p=0.002 n=6)
ParseStatus/100_files-3                19.31µ ± 12%    21.03µ ± 11%   +8.88% (p=0.026 n=6)
ParseStatus/500_files-3                83.44µ ± 10%   102.65µ ± 24%  +23.02% (p=0.004 n=6)
ParseStatus/100_renamed-3              24.27µ ± 17%    30.50µ ± 26%  +25.69% (p=0.009 n=6)
ParseStatusBranch-3                    1.602µ ±  9%    1.799µ ± 22%  +12.30% (p=0.009 n=6)
ParseDiff/10_lines-3                   835.2n ± 20%   1378.5n ± 30%  +65.04% (p=0.002 n=6)
ParseDiff/100_lines-3                  5.479µ ± 13%   10.737µ ± 28%  +95.96% (p=0.002 n=6)
ParseDiff/1000_lines-3                 55.74µ ± 37%   105.84µ ± 19%  +89.90% (p=0.002 n=6)
ParseHunkHeader/simple-3               87.91n ± 11%   105.60n ± 30%  +20.12% (p=0.002 n=6)
ParseHunkHeader/with_context-3         103.7n ±  8%    108.9n ± 20%        ~ (p=0.485 n=6)
ParseHunkHeader/large_range-3          119.4n ±  8%    118.7n ± 32%        ~ (p=1.000 n=6)
UndoStack/record_50-3                  15.40µ ± 27%    19.60µ ± 29%  +27.29% (p=0.015 n=6)
UndoStack/record_overflow-3            59.38µ ± 15%    80.25µ ± 21%  +35.14% (p=0.002 n=6)
UndoStack/peek_undo-3                  16.16n ± 12%    19.09n ± 18%  +18.17% (p=0.026 n=6)
UndoStack/can_undo_redo-3              33.30n ±  6%    35.30n ± 11%        ~ (p=0.065 n=6)
JoinPaths-3                            1.175µ ± 12%    1.675µ ±  6%  +42.45% (p=0.002 n=6)
SplitPaths-3                           3.089µ ± 19%    4.346µ ± 14%  +40.72% (p=0.002 n=6)
geomean                                1.916µ          2.468µ        +28.79%

                               │ bench-baseline.txt │          bench-current.txt           │
                               │        B/op        │     B/op      vs base                │
ParseStatus/10_files-3               2.641Ki ± 0%     2.641Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/100_files-3              24.66Ki ± 0%     24.66Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/500_files-3              111.9Ki ± 0%     111.9Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/100_renamed-3            32.16Ki ± 0%     32.16Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseStatusBranch-3                    928.0 ± 0%       928.0 ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/10_lines-3                 1.703Ki ± 0%     1.703Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/100_lines-3                11.02Ki ± 0%     11.02Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/1000_lines-3               116.5Ki ± 0%     116.5Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/simple-3               32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/with_context-3         32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/large_range-3          32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/record_50-3                22.91Ki ± 0%     22.91Ki ± 0%       ~ (p=1.000 n=6)
UndoStack/record_overflow-3          87.26Ki ± 0%     87.26Ki ± 0%       ~ (p=0.123 n=6)
UndoStack/peek_undo-3                  0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/can_undo_redo-3              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
JoinPaths-3                          2.625Ki ± 0%     2.625Ki ± 0%       ~ (p=1.000 n=6) ¹
SplitPaths-3                         6.062Ki ± 0%     6.062Ki ± 0%       ~ (p=1.000 n=6) ¹
geomean                                           ²                 +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                               │ bench-baseline.txt │         bench-current.txt          │
                               │     allocs/op      │ allocs/op   vs base                │
ParseStatus/10_files-3                 14.00 ± 0%     14.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/100_files-3                89.00 ± 0%     89.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/500_files-3                411.0 ± 0%     411.0 ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/100_renamed-3              209.0 ± 0%     209.0 ± 0%       ~ (p=1.000 n=6) ¹
ParseStatusBranch-3                    2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/10_lines-3                   9.000 ± 0%     9.000 ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/100_lines-3                  46.00 ± 0%     46.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/1000_lines-3                 448.0 ± 0%     448.0 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/simple-3               1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/with_context-3         1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/large_range-3          1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/record_50-3                  208.0 ± 0%     208.0 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/record_overflow-3            811.0 ± 0%     811.0 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/peek_undo-3                  0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/can_undo_redo-3              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
JoinPaths-3                            1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
SplitPaths-3                           7.000 ± 0%     7.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                           ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/jongio/grut/internal/markdown
                                   │ bench-baseline.txt │          bench-current.txt          │
                                   │       sec/op       │    sec/op     vs base               │
RenderStaticCached/same_width-3            426.4µ ± 12%   499.1µ ± 13%  +17.05% (p=0.002 n=6)
RenderStaticCached/varying_width-3         517.5µ ± 10%   602.7µ ± 12%  +16.46% (p=0.002 n=6)
RenderStaticCold-3                         445.3µ ± 13%   572.8µ ± 12%  +28.64% (p=0.002 n=6)
geomean                                    461.5µ         556.5µ        +20.59%

                                   │ bench-baseline.txt │         bench-current.txt          │
                                   │        B/op        │     B/op      vs base              │
RenderStaticCached/same_width-3            121.7Ki ± 0%   122.0Ki ± 0%       ~ (p=0.093 n=6)
RenderStaticCached/varying_width-3         144.0Ki ± 0%   144.1Ki ± 0%       ~ (p=0.394 n=6)
RenderStaticCold-3                         156.7Ki ± 1%   157.7Ki ± 0%       ~ (p=0.310 n=6)
geomean                                    140.0Ki        140.5Ki       +0.31%

                                   │ bench-baseline.txt │          bench-current.txt          │
                                   │     allocs/op      │  allocs/op   vs base                │
RenderStaticCached/same_width-3             12.18k ± 0%   12.18k ± 0%       ~ (p=1.000 n=6) ¹
RenderStaticCached/varying_width-3          13.76k ± 0%   13.76k ± 0%       ~ (p=0.688 n=6)
RenderStaticCold-3                          5.819k ± 0%   5.820k ± 0%       ~ (p=0.632 n=6)
geomean                                     9.916k        9.917k       +0.01%
¹ all samples are equal

pkg: github.com/jongio/grut/internal/notify
                           │ bench-baseline.txt │          bench-current.txt           │
                           │       sec/op       │    sec/op      vs base               │
NotifyToastChurn-3                 320.5n ±  5%    379.4n ± 17%  +18.37% (p=0.002 n=6)
NotifyToastLifecycleCold-3         710.9n ± 25%    882.4n ± 12%  +24.13% (p=0.026 n=6)
NotifyInlineCap-3                  838.5n ±  5%   1073.0n ± 15%  +27.97% (p=0.002 n=6)
geomean                            576.0n          710.9n        +23.43%

                           │ bench-baseline.txt │         bench-current.txt          │
                           │        B/op        │    B/op     vs base                │
NotifyToastChurn-3                   144.0 ± 0%   144.0 ± 0%       ~ (p=1.000 n=6) ¹
NotifyToastLifecycleCold-3           848.0 ± 0%   848.0 ± 0%       ~ (p=1.000 n=6) ¹
NotifyInlineCap-3                    104.0 ± 0%   104.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                              233.3        233.3       +0.00%
¹ all samples are equal

                           │ bench-baseline.txt │         bench-current.txt          │
                           │     allocs/op      │ allocs/op   vs base                │
NotifyToastChurn-3                   2.000 ± 0%   2.000 ± 0%       ~ (p=1.000 n=6) ¹
NotifyToastLifecycleCold-3           10.00 ± 0%   10.00 ± 0%       ~ (p=1.000 n=6) ¹
NotifyInlineCap-3                    2.000 ± 0%   2.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                              3.420        3.420       +0.00%
¹ all samples are equal

pkg: github.com/jongio/grut/internal/panels/filetree
                                               │ bench-baseline.txt │          bench-current.txt           │
                                               │       sec/op       │    sec/op      vs base               │
TreeRebuildVisible/flat_50_files-3                     183.5n ±  5%    239.6n ± 12%  +30.60% (p=0.002 n=6)
TreeRebuildVisible/nested_5_levels_461_nodes-3         2.321µ ±  6%    2.615µ ±  4%  +12.67% (p=0.002 n=6)
TreeRebuildVisible/large_1000_nodes-3                  4.540µ ± 15%    4.839µ ± 16%        ~ (p=0.485 n=6)
RenderLine/file_node-3                                 4.130µ ± 14%    3.943µ ±  6%        ~ (p=0.699 n=6)
RenderLine/dir_node_cursor-3                           4.588µ ±  6%    4.803µ ±  4%   +4.68% (p=0.026 n=6)
RenderLine/with_icons-3                                3.600µ ±  6%    3.677µ ± 10%   +2.12% (p=0.045 n=6)
DetachedLazyLoad/50_entries-3                          169.8µ ±  8%    198.9µ ± 12%  +17.13% (p=0.009 n=6)
DetachedLazyLoad/23_root_entries-3                     75.06µ ± 10%   117.41µ ± 15%  +56.42% (p=0.002 n=6)
DisplayWidth/ascii-3                                   64.28n ±  4%    77.12n ± 10%  +19.97% (p=0.002 n=6)
DisplayWidth/mixed_unicode-3                           213.9n ± 10%    253.0n ± 14%  +18.25% (p=0.026 n=6)
TruncateToWidth/no_truncation-3                        16.97n ±  4%    17.79n ±  7%        ~ (p=0.240 n=6)
TruncateToWidth/needs_truncation-3                     757.4n ± 15%    796.6n ± 13%        ~ (p=0.240 n=6)
geomean                                                1.607µ          1.825µ        +13.53%

                                               │ bench-baseline.txt │          bench-current.txt           │
                                               │        B/op        │     B/op      vs base                │
TreeRebuildVisible/flat_50_files-3                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
TreeRebuildVisible/nested_5_levels_461_nodes-3         0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
TreeRebuildVisible/large_1000_nodes-3                  0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/file_node-3                                 392.0 ± 0%       392.0 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/dir_node_cursor-3                           624.0 ± 0%       624.0 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/with_icons-3                                392.0 ± 0%       392.0 ± 0%       ~ (p=1.000 n=6) ¹
DetachedLazyLoad/50_entries-3                        39.91Ki ± 0%     39.91Ki ± 0%       ~ (p=1.000 n=6) ¹
DetachedLazyLoad/23_root_entries-3                   18.81Ki ± 0%     18.81Ki ± 0%       ~ (p=1.000 n=6) ¹
DisplayWidth/ascii-3                                   0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
DisplayWidth/mixed_unicode-3                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
TruncateToWidth/no_truncation-3                        0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
TruncateToWidth/needs_truncation-3                     544.0 ± 0%       544.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                           ²                 +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                               │ bench-baseline.txt │         bench-current.txt          │
                                               │     allocs/op      │ allocs/op   vs base                │
TreeRebuildVisible/flat_50_files-3                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
TreeRebuildVisible/nested_5_levels_461_nodes-3         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
TreeRebuildVisible/large_1000_nodes-3                  0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/file_node-3                                 12.00 ± 0%     12.00 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/dir_node_cursor-3                           18.00 ± 0%     18.00 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/with_icons-3                                12.00 ± 0%     12.00 ± 0%       ~ (p=1.000 n=6) ¹
DetachedLazyLoad/50_entries-3                          365.0 ± 0%     365.0 ± 0%       ~ (p=1.000 n=6) ¹
DetachedLazyLoad/23_root_entries-3                     166.0 ± 0%     166.0 ± 0%       ~ (p=1.000 n=6) ¹
DisplayWidth/ascii-3                                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DisplayWidth/mixed_unicode-3                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
TruncateToWidth/no_truncation-3                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
TruncateToWidth/needs_truncation-3                     3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                           ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/jongio/grut/internal/panels/gitdiff
                                                   │ bench-baseline.txt │          bench-current.txt          │
                                                   │       sec/op       │    sec/op     vs base               │
InlineDiffRenderExact/10_lines-3                           36.29µ ±  7%   39.94µ ± 18%  +10.03% (p=0.041 n=6)
InlineDiffRenderExact/100_lines-3                          306.0µ ±  8%   339.4µ ±  6%  +10.91% (p=0.004 n=6)
InlineDiffRenderExact/1000_lines-3                         3.033m ±  9%   3.664m ± 20%  +20.79% (p=0.002 n=6)
InlineDiffRenderCold-3                                     303.6µ ± 10%   334.3µ ±  9%  +10.10% (p=0.015 n=6)
SideBySideDiffRenderExact/10_lines-3                       54.44µ ±  6%   70.61µ ± 16%  +29.71% (p=0.002 n=6)
SideBySideDiffRenderExact/100_lines-3                      492.1µ ±  3%   579.6µ ± 10%  +17.78% (p=0.002 n=6)
SideBySideDiffRenderExact/1000_lines-3                     4.931m ±  5%   5.976m ± 17%  +21.21% (p=0.002 n=6)
SideBySideDiffRenderCold-3                                 487.3µ ±  4%   594.5µ ±  9%  +22.01% (p=0.002 n=6)
PairDiffLines/20_lines_mixed-3                             175.8n ±  6%   270.0n ±  8%  +53.63% (p=0.002 n=6)
PairDiffLines/200_lines_mixed-3                            1.254µ ± 39%   1.486µ ± 47%  +18.50% (p=0.041 n=6)
RenderViewportWithStats/small-3                            3.948µ ±  3%   4.933µ ±  5%  +24.92% (p=0.002 n=6)
RenderViewportWithStats/large_scrolled-3                   4.212µ ±  5%   5.571µ ± 27%  +32.28% (p=0.002 n=6)
DiffWordsBoundedAllocations/50_tokens-3                    15.25µ ±  5%   18.49µ ±  9%  +21.29% (p=0.002 n=6)
DiffWordsBoundedAllocations/200_tokens-3                   228.8µ ±  6%   245.6µ ± 15%   +7.33% (p=0.009 n=6)
DiffWordsBoundedAllocations/400_tokens-3                   889.0µ ±  6%   896.5µ ±  6%        ~ (p=0.394 n=6)
DiffWordsBoundedAllocations/over_cap_tokens-3              4.388µ ±  8%   5.213µ ±  6%  +18.80% (p=0.002 n=6)
DiffWordsBoundedAllocations/one_mib_over_cap-3             4.433µ ±  6%   5.329µ ± 25%  +20.23% (p=0.002 n=6)
DiffWordsBoundedAllocations/one_mib_single_token-3         6.625m ±  8%   7.219m ±  8%   +8.96% (p=0.002 n=6)
geomean                                                    67.99µ         80.84µ        +18.89%

                                                   │ bench-baseline.txt │          bench-current.txt           │
                                                   │        B/op        │     B/op      vs base                │
InlineDiffRenderExact/10_lines-3                           4.016Ki ± 0%   4.016Ki ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderExact/100_lines-3                          33.47Ki ± 0%   33.47Ki ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderExact/1000_lines-3                         334.7Ki ± 0%   334.7Ki ± 0%       ~ (p=0.273 n=6)
InlineDiffRenderCold-3                                     37.97Ki ± 0%   37.97Ki ± 0%       ~ (p=1.000 n=6)
SideBySideDiffRenderExact/10_lines-3                       15.50Ki ± 0%   15.50Ki ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/100_lines-3                      144.3Ki ± 0%   144.3Ki ± 0%  -0.00% (p=0.045 n=6)
SideBySideDiffRenderExact/1000_lines-3                     1.410Mi ± 0%   1.410Mi ± 0%       ~ (p=0.087 n=6)
SideBySideDiffRenderCold-3                                 148.8Ki ± 0%   148.8Ki ± 0%       ~ (p=0.065 n=6)
PairDiffLines/20_lines_mixed-3                               416.0 ± 0%     416.0 ± 0%       ~ (p=1.000 n=6) ¹
PairDiffLines/200_lines_mixed-3                            3.469Ki ± 0%   3.469Ki ± 0%       ~ (p=1.000 n=6) ¹
RenderViewportWithStats/small-3                            6.367Ki ± 0%   6.367Ki ± 0%       ~ (p=1.000 n=6) ¹
RenderViewportWithStats/large_scrolled-3                   6.375Ki ± 0%   6.376Ki ± 0%  +0.02% (p=0.002 n=6)
DiffWordsBoundedAllocations/50_tokens-3                    4.125Ki ± 0%   4.125Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/200_tokens-3                   18.12Ki ± 0%   18.12Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/400_tokens-3                   36.62Ki ± 0%   36.62Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/over_cap_tokens-3              18.12Ki ± 0%   18.12Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/one_mib_over_cap-3             18.12Ki ± 0%   18.12Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/one_mib_single_token-3           896.0 ± 0%     896.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                    17.94Ki        17.94Ki       +0.00%
¹ all samples are equal

                                                   │ bench-baseline.txt │          bench-current.txt          │
                                                   │     allocs/op      │  allocs/op   vs base                │
InlineDiffRenderExact/10_lines-3                             122.0 ± 0%    122.0 ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderExact/100_lines-3                           1.096k ± 0%   1.096k ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderExact/1000_lines-3                          10.96k ± 0%   10.96k ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderCold-3                                      1.110k ± 0%   1.110k ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/10_lines-3                         217.0 ± 0%    217.0 ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/100_lines-3                       2.044k ± 0%   2.044k ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/1000_lines-3                      20.44k ± 0%   20.44k ± 0%       ~ (p=0.182 n=6)
SideBySideDiffRenderCold-3                                  2.058k ± 0%   2.058k ± 0%       ~ (p=1.000 n=6) ¹
PairDiffLines/20_lines_mixed-3                               3.000 ± 0%    3.000 ± 0%       ~ (p=1.000 n=6) ¹
PairDiffLines/200_lines_mixed-3                              3.000 ± 0%    3.000 ± 0%       ~ (p=1.000 n=6) ¹
RenderViewportWithStats/small-3                              18.00 ± 0%    18.00 ± 0%       ~ (p=1.000 n=6) ¹
RenderViewportWithStats/large_scrolled-3                     19.00 ± 0%    19.00 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/50_tokens-3                      8.000 ± 0%    8.000 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/200_tokens-3                     12.00 ± 0%    12.00 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/400_tokens-3                     14.00 ± 0%    14.00 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/over_cap_tokens-3                6.000 ± 0%    6.000 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/one_mib_over_cap-3               6.000 ± 0%    6.000 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/one_mib_single_token-3           4.000 ± 0%    4.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                      80.02         80.02       -0.00%
¹ all samples are equal

Caution

Benchmarks regressed by more than 40% on darwin-arm64.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmarks: linux-amd64

📊 Results vs main (same-runner) , click to expand
goos: linux
goarch: amd64
pkg: github.com/jongio/grut/internal/ai
cpu: AMD EPYC 9V74 80-Core Processor                
                                       │ bench-baseline.txt │         bench-current.txt          │
                                       │       sec/op       │    sec/op     vs base              │
RedactContent/small_500B-4                     116.7µ ±  5%   123.0µ ± 14%  +5.39% (p=0.009 n=6)
RedactContent/medium_5KB-4                     1.545m ±  3%   1.523m ±  1%       ~ (p=0.180 n=6)
RedactContent/large_50KB-4                     16.00m ±  1%   16.04m ±  1%       ~ (p=0.589 n=6)
RedactContent_NoMatch/small_500B-4             163.1µ ±  5%   168.4µ ±  4%       ~ (p=0.065 n=6)
RedactContent_NoMatch/medium_5KB-4             1.832m ± 19%   1.796m ±  1%       ~ (p=0.093 n=6)
RedactContent_NoMatch/large_50KB-4             18.71m ±  8%   18.62m ±  1%       ~ (p=0.818 n=6)
ShouldExcludeFile/match_builtin-4              72.44n ±  1%   72.36n ±  0%       ~ (p=0.485 n=6)
ShouldExcludeFile/match_user_pattern-4         2.977µ ±  3%   3.012µ ±  1%       ~ (p=0.132 n=6)
ShouldExcludeFile/no_match-4                   2.057µ ±  1%   2.043µ ±  1%       ~ (p=0.851 n=6)
NewRedactor-4                                  737.9n ±  4%   737.2n ±  1%       ~ (p=0.667 n=6)
geomean                                        74.51µ         74.90µ        +0.52%

                                       │ bench-baseline.txt │           bench-current.txt           │
                                       │        B/op        │     B/op       vs base                │
RedactContent/small_500B-4                 2.879Ki ±   0%     2.879Ki ±  0%       ~ (p=0.394 n=6)
RedactContent/medium_5KB-4                 36.38Ki ±   1%     36.35Ki ±  0%       ~ (p=0.818 n=6)
RedactContent/large_50KB-4                 370.3Ki ±   0%     370.2Ki ±  0%  -0.01% (p=0.006 n=6)
RedactContent_NoMatch/small_500B-4           4.000 ±    ?       4.000 ±   ?       ~ (p=0.991 n=6)
RedactContent_NoMatch/medium_5KB-4           69.50 ± 149%       65.00 ± 86%       ~ (p=0.589 n=6)
RedactContent_NoMatch/large_50KB-4           60.50 ±  97%      113.00 ± 93%       ~ (p=1.000 n=6)
ShouldExcludeFile/match_builtin-4            0.000 ±   0%       0.000 ±  0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/match_user_pattern-4       0.000 ±   0%       0.000 ±  0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/no_match-4                 0.000 ±   0%       0.000 ±  0%       ~ (p=1.000 n=6) ¹
NewRedactor-4                              1.320Ki ±   0%     1.320Ki ±  0%       ~ (p=1.000 n=6) ¹
geomean                                                   ²                  +5.73%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                       │ bench-baseline.txt │         bench-current.txt          │
                                       │     allocs/op      │ allocs/op   vs base                │
RedactContent/small_500B-4                     12.00 ± 0%     12.00 ± 0%       ~ (p=1.000 n=6) ¹
RedactContent/medium_5KB-4                     60.00 ± 0%     60.00 ± 0%       ~ (p=1.000 n=6) ¹
RedactContent/large_50KB-4                     483.0 ± 0%     483.0 ± 0%       ~ (p=0.455 n=6)
RedactContent_NoMatch/small_500B-4             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
RedactContent_NoMatch/medium_5KB-4             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
RedactContent_NoMatch/large_50KB-4             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/match_builtin-4              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/match_user_pattern-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
ShouldExcludeFile/no_match-4                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
NewRedactor-4                                  5.000 ± 0%     5.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                   ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/jongio/grut/internal/config
                                   │ bench-baseline.txt │         bench-current.txt         │
                                   │       sec/op       │   sec/op     vs base              │
Validate/valid_defaults-4                   2.296µ ± 2%   2.272µ ± 1%  -1.07% (p=0.002 n=6)
Validate/with_arrays-4                      8.812µ ± 8%   8.777µ ± 1%       ~ (p=0.240 n=6)
Validate/invalid_multi_error-4              5.002µ ± 0%   4.962µ ± 0%  -0.81% (p=0.006 n=6)
ParseDefaultsTOML-4                         31.10µ ± 0%   31.38µ ± 1%  +0.91% (p=0.002 n=6)
RejectEmbeddedKeys/clean_config-4           1.548µ ± 2%   1.539µ ± 2%       ~ (p=0.558 n=6)
RejectEmbeddedKeys/with_patterns-4          9.487µ ± 1%   9.445µ ± 3%       ~ (p=0.372 n=6)
AppendEnumErr/match_first-4                 31.07n ± 0%   31.82n ± 1%  +2.43% (p=0.002 n=6)
AppendEnumErr/match_last-4                  31.73n ± 0%   32.32n ± 0%  +1.88% (p=0.002 n=6)
AppendEnumErr/no_match-4                    766.1n ± 0%   763.9n ± 0%       ~ (p=0.180 n=6)
geomean                                     1.484µ        1.487µ       +0.18%

                                   │ bench-baseline.txt │          bench-current.txt           │
                                   │        B/op        │     B/op      vs base                │
Validate/valid_defaults-4                  868.0 ± 0%       868.0 ± 0%       ~ (p=1.000 n=6)
Validate/with_arrays-4                     867.0 ± 0%       867.0 ± 0%       ~ (p=1.000 n=6)
Validate/invalid_multi_error-4           2.038Ki ± 0%     2.039Ki ± 0%       ~ (p=0.374 n=6)
ParseDefaultsTOML-4                      1.836Ki ± 0%     1.836Ki ± 0%       ~ (p=0.545 n=6)
RejectEmbeddedKeys/clean_config-4          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
RejectEmbeddedKeys/with_patterns-4         0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/match_first-4                48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/match_last-4                 48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/no_match-4                   346.0 ± 0%       346.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                               ²                 +0.01%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                   │ bench-baseline.txt │         bench-current.txt          │
                                   │     allocs/op      │ allocs/op   vs base                │
Validate/valid_defaults-4                  18.00 ± 0%     18.00 ± 0%       ~ (p=1.000 n=6) ¹
Validate/with_arrays-4                     18.00 ± 0%     18.00 ± 0%       ~ (p=1.000 n=6) ¹
Validate/invalid_multi_error-4             58.00 ± 0%     58.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseDefaultsTOML-4                        52.00 ± 0%     52.00 ± 0%       ~ (p=1.000 n=6) ¹
RejectEmbeddedKeys/clean_config-4          0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
RejectEmbeddedKeys/with_patterns-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/match_first-4                1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/match_last-4                 1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
AppendEnumErr/no_match-4                   12.00 ± 0%     12.00 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                               ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/jongio/grut/internal/crashlog
                                 │ bench-baseline.txt │         bench-current.txt         │
                                 │       sec/op       │   sec/op     vs base              │
ScrubPII/small_100B-4                     12.98µ ± 2%   13.13µ ± 2%       ~ (p=0.589 n=6)
ScrubPII/medium_1KB-4                     228.0µ ± 3%   224.2µ ± 1%  -1.66% (p=0.041 n=6)
ScrubPII/large_10KB-4                     2.962m ± 3%   2.975m ± 5%       ~ (p=0.589 n=6)
ScrubPII_NoSecrets/100B-4                 23.84µ ± 3%   23.80µ ± 3%       ~ (p=0.699 n=6)
ScrubPII_NoSecrets/1KB-4                  233.1µ ± 1%   233.1µ ± 3%       ~ (p=0.818 n=6)
ScrubPII_NoSecrets/10KB-4                 2.871m ± 2%   2.846m ± 2%       ~ (p=0.310 n=6)
ScrubLogTail/10_entries-4                 130.8µ ± 1%   132.8µ ± 2%  +1.55% (p=0.041 n=6)
ScrubLogTail/50_entries-4                 651.0µ ± 2%   652.1µ ± 4%       ~ (p=0.485 n=6)
ScrubLogTail/100_entries_mixed-4          10.93m ± 3%   10.84m ± 2%       ~ (p=0.310 n=6)
geomean                                   370.1µ        369.9µ       -0.04%

                                 │ bench-baseline.txt │         bench-current.txt          │
                                 │        B/op        │     B/op      vs base              │
ScrubPII/small_100B-4                      913.5 ± 0%     913.0 ± 0%       ~ (p=0.407 n=6)
ScrubPII/medium_1KB-4                    11.89Ki ± 0%   11.89Ki ± 0%       ~ (p=0.353 n=6)
ScrubPII/large_10KB-4                    228.6Ki ± 0%   228.3Ki ± 0%       ~ (p=0.065 n=6)
ScrubPII_NoSecrets/100B-4                1.174Ki ± 0%   1.173Ki ± 0%       ~ (p=0.935 n=6)
ScrubPII_NoSecrets/1KB-4                 10.09Ki ± 0%   10.09Ki ± 0%       ~ (p=0.576 n=6)
ScrubPII_NoSecrets/10KB-4                101.0Ki ± 0%   100.9Ki ± 1%       ~ (p=0.589 n=6)
ScrubLogTail/10_entries-4                9.084Ki ± 0%   9.083Ki ± 0%       ~ (p=1.000 n=6)
ScrubLogTail/50_entries-4                45.51Ki ± 0%   45.49Ki ± 0%       ~ (p=0.119 n=6)
ScrubLogTail/100_entries_mixed-4         545.5Ki ± 0%   545.5Ki ± 0%       ~ (p=0.513 n=6)
geomean                                  20.55Ki        20.54Ki       -0.05%

                                 │ bench-baseline.txt │          bench-current.txt          │
                                 │     allocs/op      │  allocs/op   vs base                │
ScrubPII/small_100B-4                      17.00 ± 0%    17.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubPII/medium_1KB-4                      27.00 ± 0%    27.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubPII/large_10KB-4                      80.00 ± 1%    79.00 ± 1%       ~ (p=0.567 n=6)
ScrubPII_NoSecrets/100B-4                  15.00 ± 0%    15.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubPII_NoSecrets/1KB-4                   15.00 ± 0%    15.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubPII_NoSecrets/10KB-4                  15.00 ± 0%    15.00 ± 0%       ~ (p=1.000 n=6) ¹
ScrubLogTail/10_entries-4                  171.0 ± 0%    171.0 ± 0%       ~ (p=1.000 n=6) ¹
ScrubLogTail/50_entries-4                  851.0 ± 0%    851.0 ± 0%       ~ (p=1.000 n=6) ¹
ScrubLogTail/100_entries_mixed-4          1.909k ± 0%   1.909k ± 0%       ~ (p=1.000 n=6) ¹
geomean                                    68.78         68.68       -0.14%
¹ all samples are equal

pkg: github.com/jongio/grut/internal/git
                               │ bench-baseline.txt │         bench-current.txt          │
                               │       sec/op       │    sec/op     vs base              │
ParseStatus/10_files-4                  1.717µ ± 7%    1.733µ ± 7%  +0.93% (p=0.043 n=6)
ParseStatus/100_files-4                 15.24µ ± 1%    15.30µ ± 1%       ~ (p=0.180 n=6)
ParseStatus/500_files-4                 73.52µ ± 2%    73.06µ ± 5%       ~ (p=0.699 n=6)
ParseStatus/100_renamed-4               22.97µ ± 1%    22.99µ ± 2%       ~ (p=0.699 n=6)
ParseStatusBranch-4                     1.657µ ± 0%    1.671µ ± 1%  +0.88% (p=0.009 n=6)
ParseDiff/10_lines-4                    992.1n ± 0%   1002.5n ± 2%  +1.05% (p=0.009 n=6)
ParseDiff/100_lines-4                   6.308µ ± 1%    6.337µ ± 1%       ~ (p=0.255 n=6)
ParseDiff/1000_lines-4                  63.41µ ± 1%    64.20µ ± 1%  +1.26% (p=0.004 n=6)
ParseHunkHeader/simple-4                95.54n ± 1%    95.32n ± 0%  -0.24% (p=0.004 n=6)
ParseHunkHeader/with_context-4          104.2n ± 1%    102.5n ± 1%  -1.63% (p=0.004 n=6)
ParseHunkHeader/large_range-4           114.5n ± 1%    113.4n ± 0%  -1.00% (p=0.002 n=6)
UndoStack/record_50-4                   15.62µ ± 0%    15.75µ ± 0%  +0.85% (p=0.002 n=6)
UndoStack/record_overflow-4             63.01µ ± 1%    63.42µ ± 1%       ~ (p=0.310 n=6)
UndoStack/peek_undo-4                   7.720n ± 0%    7.710n ± 0%  -0.13% (p=0.004 n=6)
UndoStack/can_undo_redo-4               12.86n ± 2%    12.86n ± 0%       ~ (p=0.576 n=6)
JoinPaths-4                             1.256µ ± 0%    1.268µ ± 3%  +0.96% (p=0.006 n=6)
SplitPaths-4                            2.220µ ± 1%    2.262µ ± 3%  +1.91% (p=0.002 n=6)
geomean                                 1.709µ         1.714µ       +0.33%

                               │ bench-baseline.txt │          bench-current.txt           │
                               │        B/op        │     B/op      vs base                │
ParseStatus/10_files-4               2.641Ki ± 0%     2.641Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/100_files-4              24.66Ki ± 0%     24.66Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/500_files-4              111.9Ki ± 0%     111.9Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/100_renamed-4            32.16Ki ± 0%     32.16Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseStatusBranch-4                    928.0 ± 0%       928.0 ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/10_lines-4                 1.703Ki ± 0%     1.703Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/100_lines-4                11.02Ki ± 0%     11.02Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/1000_lines-4               116.5Ki ± 0%     116.5Ki ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/simple-4               32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/with_context-4         32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/large_range-4          32.00 ± 0%       32.00 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/record_50-4                22.91Ki ± 0%     22.91Ki ± 0%  +0.00% (p=0.002 n=6)
UndoStack/record_overflow-4          87.27Ki ± 0%     87.27Ki ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/peek_undo-4                  0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/can_undo_redo-4              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
JoinPaths-4                          2.625Ki ± 0%     2.625Ki ± 0%       ~ (p=1.000 n=6) ¹
SplitPaths-4                         6.062Ki ± 0%     6.062Ki ± 0%       ~ (p=1.000 n=6) ¹
geomean                                           ²                 +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                               │ bench-baseline.txt │         bench-current.txt          │
                               │     allocs/op      │ allocs/op   vs base                │
ParseStatus/10_files-4                 14.00 ± 0%     14.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/100_files-4                89.00 ± 0%     89.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/500_files-4                411.0 ± 0%     411.0 ± 0%       ~ (p=1.000 n=6) ¹
ParseStatus/100_renamed-4              209.0 ± 0%     209.0 ± 0%       ~ (p=1.000 n=6) ¹
ParseStatusBranch-4                    2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/10_lines-4                   9.000 ± 0%     9.000 ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/100_lines-4                  46.00 ± 0%     46.00 ± 0%       ~ (p=1.000 n=6) ¹
ParseDiff/1000_lines-4                 448.0 ± 0%     448.0 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/simple-4               1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/with_context-4         1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
ParseHunkHeader/large_range-4          1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/record_50-4                  208.0 ± 0%     208.0 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/record_overflow-4            811.0 ± 0%     811.0 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/peek_undo-4                  0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
UndoStack/can_undo_redo-4              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
JoinPaths-4                            1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
SplitPaths-4                           7.000 ± 0%     7.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                           ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/jongio/grut/internal/markdown
                                   │ bench-baseline.txt │         bench-current.txt         │
                                   │       sec/op       │   sec/op     vs base              │
RenderStaticCached/same_width-4             519.6µ ± 5%   517.8µ ± 2%       ~ (p=0.180 n=6)
RenderStaticCached/varying_width-4          594.0µ ± 2%   591.0µ ± 7%       ~ (p=0.310 n=6)
RenderStaticCold-4                          505.1µ ± 1%   503.6µ ± 0%  -0.29% (p=0.026 n=6)
geomean                                     538.2µ        536.1µ       -0.39%

                                   │ bench-baseline.txt │         bench-current.txt          │
                                   │        B/op        │     B/op      vs base              │
RenderStaticCached/same_width-4            122.0Ki ± 0%   122.0Ki ± 0%       ~ (p=0.937 n=6)
RenderStaticCached/varying_width-4         144.6Ki ± 0%   144.3Ki ± 0%       ~ (p=0.485 n=6)
RenderStaticCold-4                         161.7Ki ± 0%   161.5Ki ± 0%       ~ (p=0.818 n=6)
geomean                                    141.8Ki        141.7Ki       -0.10%

                                   │ bench-baseline.txt │          bench-current.txt          │
                                   │     allocs/op      │  allocs/op   vs base                │
RenderStaticCached/same_width-4             12.18k ± 0%   12.18k ± 0%       ~ (p=1.000 n=6) ¹
RenderStaticCached/varying_width-4          13.76k ± 0%   13.77k ± 0%       ~ (p=0.459 n=6)
RenderStaticCold-4                          5.824k ± 0%   5.823k ± 0%       ~ (p=0.429 n=6)
geomean                                     9.919k        9.919k       +0.00%
¹ all samples are equal

pkg: github.com/jongio/grut/internal/notify
                           │ bench-baseline.txt │         bench-current.txt         │
                           │       sec/op       │   sec/op     vs base              │
NotifyToastChurn-4                  326.3n ± 2%   326.2n ± 3%       ~ (p=0.589 n=6)
NotifyToastLifecycleCold-4          644.6n ± 1%   653.7n ± 3%       ~ (p=0.132 n=6)
NotifyInlineCap-4                   1.025µ ± 0%   1.028µ ± 1%       ~ (p=0.383 n=6)
geomean                             599.6n        602.9n       +0.55%

                           │ bench-baseline.txt │         bench-current.txt          │
                           │        B/op        │    B/op     vs base                │
NotifyToastChurn-4                   144.0 ± 0%   144.0 ± 0%       ~ (p=1.000 n=6) ¹
NotifyToastLifecycleCold-4           848.0 ± 0%   848.0 ± 0%       ~ (p=1.000 n=6) ¹
NotifyInlineCap-4                    104.0 ± 0%   104.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                              233.3        233.3       +0.00%
¹ all samples are equal

                           │ bench-baseline.txt │         bench-current.txt          │
                           │     allocs/op      │ allocs/op   vs base                │
NotifyToastChurn-4                   2.000 ± 0%   2.000 ± 0%       ~ (p=1.000 n=6) ¹
NotifyToastLifecycleCold-4           10.00 ± 0%   10.00 ± 0%       ~ (p=1.000 n=6) ¹
NotifyInlineCap-4                    2.000 ± 0%   2.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                              3.420        3.420       +0.00%
¹ all samples are equal

pkg: github.com/jongio/grut/internal/panels/filetree
                                               │ bench-baseline.txt │         bench-current.txt         │
                                               │       sec/op       │   sec/op     vs base              │
TreeRebuildVisible/flat_50_files-4                      292.2n ± 1%   291.6n ± 2%       ~ (p=0.942 n=6)
TreeRebuildVisible/nested_5_levels_461_nodes-4          2.888µ ± 1%   2.876µ ± 0%  -0.42% (p=0.009 n=6)
TreeRebuildVisible/large_1000_nodes-4                   5.824µ ± 0%   5.819µ ± 0%       ~ (p=0.299 n=6)
RenderLine/file_node-4                                  4.709µ ± 2%   4.706µ ± 1%       ~ (p=0.511 n=6)
RenderLine/dir_node_cursor-4                            6.080µ ± 0%   6.052µ ± 1%       ~ (p=0.065 n=6)
RenderLine/with_icons-4                                 4.802µ ± 0%   4.795µ ± 2%       ~ (p=0.102 n=6)
DetachedLazyLoad/50_entries-4                           162.1µ ± 1%   161.2µ ± 0%  -0.52% (p=0.002 n=6)
DetachedLazyLoad/23_root_entries-4                      71.51µ ± 0%   71.43µ ± 1%       ~ (p=0.197 n=6)
DisplayWidth/ascii-4                                    74.34n ± 0%   74.24n ± 0%       ~ (p=0.660 n=6)
DisplayWidth/mixed_unicode-4                            306.3n ± 2%   307.8n ± 2%       ~ (p=0.937 n=6)
TruncateToWidth/no_truncation-4                         21.82n ± 1%   21.53n ± 2%  -1.33% (p=0.004 n=6)
TruncateToWidth/needs_truncation-4                      841.3n ± 0%   843.8n ± 0%       ~ (p=0.167 n=6)
geomean                                                 1.963µ        1.959µ       -0.22%

                                               │ bench-baseline.txt │          bench-current.txt           │
                                               │        B/op        │     B/op      vs base                │
TreeRebuildVisible/flat_50_files-4                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
TreeRebuildVisible/nested_5_levels_461_nodes-4         0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
TreeRebuildVisible/large_1000_nodes-4                  0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/file_node-4                                 392.0 ± 0%       392.0 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/dir_node_cursor-4                           624.0 ± 0%       624.0 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/with_icons-4                                392.0 ± 0%       392.0 ± 0%       ~ (p=1.000 n=6) ¹
DetachedLazyLoad/50_entries-4                        34.12Ki ± 0%     34.12Ki ± 0%       ~ (p=0.327 n=6)
DetachedLazyLoad/23_root_entries-4                   14.77Ki ± 0%     14.77Ki ± 0%       ~ (p=0.814 n=6)
DisplayWidth/ascii-4                                   0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
DisplayWidth/mixed_unicode-4                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
TruncateToWidth/no_truncation-4                        0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
TruncateToWidth/needs_truncation-4                     544.0 ± 0%       544.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                           ²                 +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                               │ bench-baseline.txt │         bench-current.txt          │
                                               │     allocs/op      │ allocs/op   vs base                │
TreeRebuildVisible/flat_50_files-4                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
TreeRebuildVisible/nested_5_levels_461_nodes-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
TreeRebuildVisible/large_1000_nodes-4                  0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/file_node-4                                 12.00 ± 0%     12.00 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/dir_node_cursor-4                           18.00 ± 0%     18.00 ± 0%       ~ (p=1.000 n=6) ¹
RenderLine/with_icons-4                                12.00 ± 0%     12.00 ± 0%       ~ (p=1.000 n=6) ¹
DetachedLazyLoad/50_entries-4                          363.0 ± 0%     363.0 ± 0%       ~ (p=1.000 n=6) ¹
DetachedLazyLoad/23_root_entries-4                     164.0 ± 0%     164.0 ± 0%       ~ (p=1.000 n=6) ¹
DisplayWidth/ascii-4                                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DisplayWidth/mixed_unicode-4                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
TruncateToWidth/no_truncation-4                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
TruncateToWidth/needs_truncation-4                     3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                           ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/jongio/grut/internal/panels/gitdiff
                                                   │ bench-baseline.txt │         bench-current.txt         │
                                                   │       sec/op       │   sec/op     vs base              │
InlineDiffRenderExact/10_lines-4                            47.38µ ± 2%   47.25µ ± 0%  -0.28% (p=0.041 n=6)
InlineDiffRenderExact/100_lines-4                           411.7µ ± 1%   409.5µ ± 0%  -0.54% (p=0.002 n=6)
InlineDiffRenderExact/1000_lines-4                          4.127m ± 1%   4.111m ± 0%  -0.38% (p=0.004 n=6)
InlineDiffRenderCold-4                                      409.0µ ± 0%   407.6µ ± 1%       ~ (p=0.180 n=6)
SideBySideDiffRenderExact/10_lines-4                        85.61µ ± 0%   85.39µ ± 1%       ~ (p=0.310 n=6)
SideBySideDiffRenderExact/100_lines-4                       768.4µ ± 0%   767.6µ ± 0%       ~ (p=0.394 n=6)
SideBySideDiffRenderExact/1000_lines-4                      7.707m ± 1%   7.689m ± 0%       ~ (p=0.240 n=6)
SideBySideDiffRenderCold-4                                  790.3µ ± 1%   788.6µ ± 0%       ~ (p=0.310 n=6)
PairDiffLines/20_lines_mixed-4                              309.5n ± 1%   311.6n ± 3%  +0.69% (p=0.048 n=6)
PairDiffLines/200_lines_mixed-4                             2.233µ ± 2%   2.213µ ± 1%       ~ (p=0.084 n=6)
RenderViewportWithStats/small-4                             5.402µ ± 0%   5.365µ ± 0%  -0.68% (p=0.004 n=6)
RenderViewportWithStats/large_scrolled-4                    5.678µ ± 3%   5.656µ ± 1%       ~ (p=0.589 n=6)
DiffWordsBoundedAllocations/50_tokens-4                     28.30µ ± 1%   28.14µ ± 1%       ~ (p=0.240 n=6)
DiffWordsBoundedAllocations/200_tokens-4                    422.4µ ± 0%   422.1µ ± 0%       ~ (p=0.240 n=6)
DiffWordsBoundedAllocations/400_tokens-4                    1.723m ± 1%   1.715m ± 3%       ~ (p=0.818 n=6)
DiffWordsBoundedAllocations/over_cap_tokens-4               4.941µ ± 1%   4.849µ ± 4%       ~ (p=0.132 n=6)
DiffWordsBoundedAllocations/one_mib_over_cap-4              4.968µ ± 2%   4.883µ ± 3%       ~ (p=0.394 n=6)
DiffWordsBoundedAllocations/one_mib_single_token-4          8.871m ± 0%   8.888m ± 0%  +0.19% (p=0.026 n=6)
geomean                                                     101.3µ        100.8µ       -0.45%

                                                   │ bench-baseline.txt │          bench-current.txt           │
                                                   │        B/op        │     B/op      vs base                │
InlineDiffRenderExact/10_lines-4                           4.016Ki ± 0%   4.016Ki ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderExact/100_lines-4                          33.47Ki ± 0%   33.47Ki ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderExact/1000_lines-4                         334.7Ki ± 0%   334.7Ki ± 0%       ~ (p=1.000 n=6)
InlineDiffRenderCold-4                                     37.97Ki ± 0%   37.97Ki ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/10_lines-4                       15.50Ki ± 0%   15.50Ki ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/100_lines-4                      144.3Ki ± 0%   144.3Ki ± 0%       ~ (p=1.000 n=6)
SideBySideDiffRenderExact/1000_lines-4                     1.410Mi ± 0%   1.410Mi ± 0%       ~ (p=0.167 n=6)
SideBySideDiffRenderCold-4                                 148.8Ki ± 0%   148.8Ki ± 0%       ~ (p=0.634 n=6)
PairDiffLines/20_lines_mixed-4                               416.0 ± 0%     416.0 ± 0%       ~ (p=1.000 n=6) ¹
PairDiffLines/200_lines_mixed-4                            3.469Ki ± 0%   3.469Ki ± 0%       ~ (p=1.000 n=6) ¹
RenderViewportWithStats/small-4                            6.368Ki ± 0%   6.368Ki ± 0%       ~ (p=1.000 n=6) ¹
RenderViewportWithStats/large_scrolled-4                   6.376Ki ± 0%   6.376Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/50_tokens-4                    4.125Ki ± 0%   4.125Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/200_tokens-4                   18.12Ki ± 0%   18.12Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/400_tokens-4                   36.62Ki ± 0%   36.62Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/over_cap_tokens-4              18.12Ki ± 0%   18.12Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/one_mib_over_cap-4             18.12Ki ± 0%   18.12Ki ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/one_mib_single_token-4           896.0 ± 0%     896.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                    17.94Ki        17.94Ki       -0.00%
¹ all samples are equal

                                                   │ bench-baseline.txt │          bench-current.txt          │
                                                   │     allocs/op      │  allocs/op   vs base                │
InlineDiffRenderExact/10_lines-4                             122.0 ± 0%    122.0 ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderExact/100_lines-4                           1.096k ± 0%   1.096k ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderExact/1000_lines-4                          10.96k ± 0%   10.96k ± 0%       ~ (p=1.000 n=6) ¹
InlineDiffRenderCold-4                                      1.110k ± 0%   1.110k ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/10_lines-4                         217.0 ± 0%    217.0 ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/100_lines-4                       2.044k ± 0%   2.044k ± 0%       ~ (p=1.000 n=6) ¹
SideBySideDiffRenderExact/1000_lines-4                      20.44k ± 0%   20.44k ± 0%       ~ (p=1.000 n=6)
SideBySideDiffRenderCold-4                                  2.058k ± 0%   2.058k ± 0%       ~ (p=1.000 n=6) ¹
PairDiffLines/20_lines_mixed-4                               3.000 ± 0%    3.000 ± 0%       ~ (p=1.000 n=6) ¹
PairDiffLines/200_lines_mixed-4                              3.000 ± 0%    3.000 ± 0%       ~ (p=1.000 n=6) ¹
RenderViewportWithStats/small-4                              18.00 ± 0%    18.00 ± 0%       ~ (p=1.000 n=6) ¹
RenderViewportWithStats/large_scrolled-4                     19.00 ± 0%    19.00 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/50_tokens-4                      8.000 ± 0%    8.000 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/200_tokens-4                     12.00 ± 0%    12.00 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/400_tokens-4                     14.00 ± 0%    14.00 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/over_cap_tokens-4                6.000 ± 0%    6.000 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/one_mib_over_cap-4               6.000 ± 0%    6.000 ± 0%       ~ (p=1.000 n=6) ¹
DiffWordsBoundedAllocations/one_mib_single_token-4           4.000 ± 0%    4.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                      80.02         80.02       +0.00%
¹ all samples are equal

Note

No significant regressions on linux-amd64 (threshold: 15%, same-runner comparison).

@jongio
jongio merged commit 52c7f72 into main Aug 27, 2026
8 of 9 checks passed
@jongio
jongio deleted the fix/401-github-test-transport branch August 27, 2026 15:37
jongio added a commit that referenced this pull request Aug 27, 2026
The gate ran every benchmark for the PR code, then every benchmark for the base
code. Two contiguous blocks means two separate time windows, so anything that
changed the runner between them (cold caches, CPU frequency ramp, a noisy
neighbour) shifted one whole block at once. benchstat read that as a large,
uniform, statistically significant regression across entire packages, including
packages the PR could not reach.

Tight variance and a small p-value did not rule this out. Same-runner
comparison controls for runner-to-runner variance, not for one runner drifting
over time.

Three PRs showed it: #411 (deps only) failed on filetree on linux and crashlog
on macOS; #413 (one _test.go file in internal/github) and #414 (one file in
cmd/) both failed on macOS blaming internal/ai and internal/config. The same
code passed on main after merge. A local benchstat A/B on #411 showed the
flagged benchmark 9.77% faster, not slower.

scripts/bench-interleaved.sh compiles both versions up front, then alternates
between them one round at a time, so both are sampled across the same window
and drift applies equally. The version that runs first alternates each round so
neither absorbs any per-round warm-up cost. Total benchmark time is unchanged.

The PR comment now lists which benchmarks were flagged and how to confirm
locally, so a false positive is diagnosable without downloading artifacts.

Closes #412

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 98ae0c9c-bdbe-418e-8488-15082edca7dc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

internal/github tests share http.DefaultTransport across parallel tests

1 participant